from PySide6.QtCore import QObject, QTimer
from PySide6.QtGui import QPainterPath
from PySide6.QtWidgets import QGraphicsPathItem

class 路径动画(QObject):
    def __init__(self, 图形项: QGraphicsPathItem, 路径: QPainterPath, 基础速度: float = 0.1, 双向: bool = False, 更新频率: int = 16, 父项=None):
        """
        初始化路径动画对象。

        Args:
            图形项 (QGraphicsItem): 要动画的图形项。
            路径 (QPainterPath): 动画路径。
            基础速度 (float): 控制动画速度的基准值。值越小，速度越慢。
            双向 (bool): 是否启用双向动画，默认为False。
            更新频率 (int): 更新频率，单位为毫秒。
            父 (QObject, optional): 父对象。
        """
        super().__init__()  # 设置父对象
        self.图形项 = 图形项
        self.路径 = 路径
        self.基础速度 = 基础速度
        self.双向 = 双向
        self.更新频率 = 更新频率
        self.进度 = 0
        self.正向 = True

        self.路径长度 = self.计算路径长度()

        self.持续时间 = self.路径长度 / self.基础速度  # 根据路径长度调整持续时间

        self.定时器 = QTimer(self)  # 将定时器的父对象设置为自身
        self.定时器.timeout.connect(self.更新位置)
        self.定时器.start(self.更新频率)

    def 计算路径长度(self):
        """
        计算路径的长度。
        """
        长度 = 1
        点数 = self.路径.elementCount()
        for i in range(1, 点数):
            前一点 = self.路径.elementAt(i - 1)
            当前点 = self.路径.elementAt(i)
            长度 += ((当前点.x - 前一点.x) ** 2 + (当前点.y - 前一点.y) ** 2) ** 0.5
        return 长度

    def 更新位置(self):
        """
        更新图形项的位置。
        """
        self.进度 += self.更新频率 / self.持续时间 if self.正向 else -self.更新频率 / self.持续时间
        if self.进度 >= 1.0:
            self.进度 = 1.0
            if self.双向:
                self.正向 = False
            else:
                self.进度 = 0.0
        elif self.进度 <= 0.0:
            self.进度 = 0.0
            self.正向 = True

        pos = self.路径.pointAtPercent(self.进度)
        self.图形项.setPos(pos)

    def 停止(self):
        """
        停止动画并停止定时器。
        """
        self.定时器.stop()
        self.deleteLater()  # 安全删除对象
